package com.itheima.ood.polymorphic.demo03;

public class FuDemo01 {

    public static void main(String[] args) {

        // 使用多态的形式去创建对象
        Fu fu = new Zi();
        fu.method();

        // 通过多态的形式去访问Zi中的function方法
//        fu.function();

        /**
         * 多态的弊端：就是不能去访问子类特有的功能
         */

        /**
         * 那么我们这个子类特有的功能是实实在在存在的，那么我们就像访问子类特有的这个功能怎么办呢？
         * 向下转型(强制类型转换)：思路就是把这个fu类的引用转换成子类的引用
         * 怎么转换？格式： 子类名 对象名 = (子类名)父类的引用 ;
         *
         * 向上转型：多态的代码
         */
//        Zi zi = (Zi)fu;
//        zi.function();

        System.out.println("-------------------------------------------------");

//        Zi2 zi2 = (Zi2)fu;      // 编译的时候没有报错，因为编译的时候仅仅是检测语法格式

        /**
         * ClassCastException：类型转换异常
         * 为什么会出现类型转换异常呢？           ----> 因为我们fu类类型的本质是这个Zi的类型，因此在进行向下转型的时候，你也只能将其转换成Zi类型
         *
         * 为了提高我们代码的健壮性，我们java就给我们提供了一个关键字这个关键字就是 instanceof ， 这个关键字的主要作用就是来判断某一个对象是否是指定的类型
         * 因为我们后期在进行强转类型转换之前，我们最好是先使用这个关键字对类型进行一个判断； 怎么去使用这个关键字呢？
         * 格式：变量名 instanceof 数据类型    ----> 判断前面的这个变量的类型是否是后面指定的这个类型， 如果是是返回true, 如果不是返回false
         */
        if(fu instanceof Zi) {
            Zi zi = (Zi)fu;
            zi.function();
        }

    }

}
